package com.mixsmart.enums;

import com.mixsmart.bean.AbstractLabelValue;
import com.mixsmart.bean.LabelIntValue;
import com.mixsmart.bean.LabelValue;
import com.mixsmart.utils.StringUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 枚举辅助类
 * @author 乌草坡
 * @since 2.5.0
 */
public class EnumeratedHelper {

    /**
     * 获取枚举中指定值对应的枚举对象
     * @param enums 枚举数组
     * @param value 指定的值
     * @param <T> 具体的枚举类型
     * @return 返回对应的枚举对象
     */
    public static <T extends ISupportIntValueEnum> T getObject(T[] enums, Integer value) {
        if(null == value) {
            return null;
        }
        T type = null;
        for(T typeTmp : enums) {
            if(typeTmp.getValue().equals(value)) {
                type = typeTmp;
                break;
            }
        }
        return type;
    }

    /**
     * 获取枚举中指定值对应的枚举对象
     * @param enums 枚举数组
     * @param value 指定的值
     * @param <T> 具体的枚举类型
     * @return 返回对应的枚举对象
     */
    public static <T extends ISupportStringValueEnum> T getObject(T[] enums, String value) {
        if(StringUtils.isEmpty(value)) {
            return null;
        }
        T type = null;
        for(T typeTmp : enums) {
            if(typeTmp.getValue().equals(value)) {
                type = typeTmp;
                break;
            }
        }
        return type;
    }


    /**
     * 获取枚举项转换为LabelValue类后的列表
     * @param enums 枚举数组
     * @param <T> 列表中的类型
     * @return 返回列表
     */
    public static <T extends AbstractLabelValue> List<T> getOptions(TextValueEnum[] enums) {
        if(null == enums || enums.length == 0) {
            return Collections.emptyList();
        }
        List<T> labelValues = new ArrayList<>();
        for(TextValueEnum valueEnum : enums) {
            if(valueEnum instanceof ISupportIntValueEnum) {
                ISupportIntValueEnum intValueEnum = (ISupportIntValueEnum) valueEnum;
                labelValues.add((T)new LabelIntValue(intValueEnum.getValue(), valueEnum.getText()));
            } else if(valueEnum instanceof ISupportStringValueEnum) {
                ISupportStringValueEnum strValueEnum = (ISupportStringValueEnum) valueEnum;
                labelValues.add((T)new LabelValue(strValueEnum.getValue(), valueEnum.getText()));
            }
        }
        return labelValues;
    }
}
